home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 January: Mac OS SDK / Dev.CD Jan 98 SDK1.toast / Development Kits (Disc 1) / QuickDraw 3D / Samples / SampleCode / Skinny3DSample / Skinny3DSources ƒ / BoxModel.c < prev    next >
Encoding:
Text File  |  1997-08-14  |  9.3 KB  |  289 lines  |  [TEXT/MPS ]

  1. // File BoxModel.c
  2.  
  3. #include <Memory.h>
  4. #include <OSUtils.h>
  5.  
  6. #include     "BoxModel.h"
  7. /* 
  8.     contains the following:
  9.  
  10. TQ3GroupObject     MakeBox(void);
  11. void            DisposeBoxModel(TQ3GroupObject model);
  12. VccPtr             BoxDataToVCC(TQ3Object theObj);
  13. void            VCCtoBoxData(VccPtr vcc, TQ3BoxData *boxData);
  14.  
  15. */
  16.  
  17. static void    InitBoxData(TQ3BoxData *boxData);
  18. static void MakeFaceAttributes(TQ3BoxData *boxData);
  19. static void SetBoxResetValues(TQ3BoxData *boxData, VccPtr vcc);
  20.  
  21. extern    Rect    gContrlRect;
  22.  
  23.  
  24. //----------------------------------------------------------------------------------
  25. static void    InitBoxData(TQ3BoxData *boxData)
  26. {
  27.     float    height  =   6;
  28.     float    width   =     6;
  29.     float    depth    =    6;
  30.     
  31.     
  32.     Q3Point3D_Set(&boxData->origin, -width/2, -height/2, -depth/2);
  33.     Q3Vector3D_Set(&boxData->orientation, 0, height, 0);
  34.     Q3Vector3D_Set(&boxData->majorAxis,  width, 0, 0);
  35.     Q3Vector3D_Set(&boxData->minorAxis,  0, 0, depth);
  36.  
  37.     boxData->boxAttributeSet  = NULL;
  38.     boxData->faceAttributeSet = NULL;
  39. }
  40.  
  41. //----------------------------------------------------------------------------------
  42. static void MakeFaceAttributes(TQ3BoxData *boxData)
  43. {
  44.     TQ3Status        status;
  45.     TQ3ColorRGB        faceColor;
  46.     TQ3ColorRGB        specColor;
  47.     TQ3ColorRGB        transColor;
  48.     float    ambientCoeff;
  49.     float    specularCntl;
  50.     long    i;
  51.  
  52.     boxData->faceAttributeSet = (TQ3AttributeSet *)NewPtrClear(sizeof(TQ3AttributeSet) * 6);
  53.     if (boxData->faceAttributeSet == NULL)
  54.         return;
  55.  
  56.     for (i = 0; i < 6; i++)
  57.         boxData->faceAttributeSet[i] = NULL;
  58.     
  59.     faceColor.r = 0.0;
  60.     faceColor.g = 1.0;
  61.     faceColor.b = 0.0;
  62.     
  63.     specColor.r = 0.0;
  64.     specColor.g = 0.0;
  65.     specColor.b = 1.0;
  66.     
  67.     transColor.r = 0.0;
  68.     transColor.g = 1.0;
  69.     transColor.b = 0.0;
  70.     
  71.     ambientCoeff = 0.5;
  72.     specularCntl = 0.5;
  73.     
  74.     for (i = 0; i < 6; i++) {
  75.         boxData->faceAttributeSet[i] = Q3AttributeSet_New();
  76.         if (boxData->faceAttributeSet[i] != nil) {
  77.              status = Q3AttributeSet_Add(boxData->faceAttributeSet[i], 
  78.                              kQ3AttributeTypeDiffuseColor, &faceColor);
  79.              status = Q3AttributeSet_Add(boxData->faceAttributeSet[i], 
  80.                             kQ3AttributeTypeSpecularColor, &specColor);
  81.              status = Q3AttributeSet_Add(boxData->faceAttributeSet[i], 
  82.                             kQ3AttributeTypeSpecularColor, &transColor);
  83.              status = Q3AttributeSet_Add(boxData->faceAttributeSet[i], 
  84.                             kQ3AttributeTypeAmbientCoefficient, &ambientCoeff);
  85.              status = Q3AttributeSet_Add(boxData->faceAttributeSet[i], 
  86.                             kQ3AttributeTypeSpecularControl, &specularCntl);
  87.         }
  88.     }
  89. }
  90.  
  91.  
  92. //----------------------------------------------------------------------------------
  93. TQ3GroupObject MakeBox(void)
  94. {
  95.     TQ3GroupObject        model;
  96.     TQ3GeometryObject     box;
  97.     TQ3GroupPosition        position;
  98.     TQ3BoxData            boxData;
  99.     TQ3Status            status;
  100.     long                i;
  101.     
  102.     InitBoxData(&boxData);
  103.     MakeFaceAttributes(&boxData);
  104.     
  105.     box      = Q3Box_New(&boxData);                if (box == nil)        return nil;
  106.     model      = Q3OrderedDisplayGroup_New();     if (model == nil)    return nil;
  107.     position = Q3Group_AddObject(model, box);    if (position == nil) return nil;
  108.     
  109.     if (boxData.boxAttributeSet != nil)
  110.         Q3Object_Dispose(boxData.boxAttributeSet);
  111.         
  112.     if (boxData.faceAttributeSet != nil) {
  113.         for (i = 0; i < 6; i++) 
  114.             if (boxData.faceAttributeSet[i] != nil)
  115.                 Q3Object_Dispose(boxData.faceAttributeSet[i]);
  116.  
  117.         DisposePtr((Ptr)boxData.faceAttributeSet);
  118.     }
  119.  
  120.     Q3Object_Dispose(box);
  121.  
  122.     return model;
  123. }
  124.  
  125.     
  126.  
  127. //----------------------------------------------------------------------------------
  128. void DisposeBoxModel(TQ3GroupObject model)
  129. {
  130.     Q3Group_EmptyObjects(model);
  131.     Q3Object_Dispose(model);
  132. }
  133.  
  134. //----------------------------------------------------------------------------------
  135. VccPtr BoxDataToVCC(TQ3Object theObj)
  136. {
  137.     TQ3BoxData            boxData;
  138.     TQ3AttributeSet    attrSet;
  139.     TQ3Status            status;
  140.     VccPtr             vcc;
  141.     TQ3ColorRGB        faceColor;
  142.     TQ3ColorRGB        specColor;
  143.     TQ3ColorRGB        transColor;
  144.     float            ambientCoeff;
  145.     float            specularCntl;
  146.     long            i;
  147.             
  148.     status = Q3Box_GetData( theObj, &boxData );
  149.     if (status == kQ3Failure)
  150.         return;
  151.     
  152.     vcc = NewVCluster((long)kQ3GeometryTypeBox, "\pBoxData", 30, &gContrlRect);
  153.     if (vcc == nil) {
  154.         SysBeep(10); // ErrMsg("\pNewVCluster failed");
  155.         return nil;
  156.     }
  157.     
  158.     AddValueCtl(vcc, "\porigin.x", boxData.origin.x, -20.0, 20.0, 1.0); // [0]
  159.     AddValueCtl(vcc, "\porigin.y", boxData.origin.y, -20.0, 20.0, 1.0);
  160.     AddValueCtl(vcc, "\porigin.z", boxData.origin.z, -20.0, 20.0, 1.0);
  161.     AddSeparator(vcc);
  162.     AddValueCtl(vcc, "\porientation.x", boxData.orientation.x, 0.0, 10.0, 0.5); // [4]
  163.     AddValueCtl(vcc, "\porientation.y", boxData.orientation.y, 0.0, 10.0, 0.5);
  164.     AddValueCtl(vcc, "\porientation.z", boxData.orientation.z, 0.0, 10.0, 0.5);
  165.     AddSeparator(vcc);
  166.     AddValueCtl(vcc, "\pmajorAxis.x", boxData.majorAxis.x, 0.0, 10.0, 0.5); // [8]
  167.     AddValueCtl(vcc, "\pmajorAxis.y", boxData.majorAxis.y, 0.0, 10.0, 0.5);
  168.     AddValueCtl(vcc, "\pmajorAxis.z", boxData.majorAxis.z, 0.0, 10.0, 0.5);
  169.     AddSeparator(vcc);
  170.     AddValueCtl(vcc, "\pminorAxis.x", boxData.minorAxis.x, 0.0, 10.0, 0.5); // [12]
  171.     AddValueCtl(vcc, "\pminorAxis.y", boxData.minorAxis.y, 0.0, 10.0, 0.5);
  172.     AddValueCtl(vcc, "\pminorAxis.z", boxData.minorAxis.z, 0.0, 10.0, 0.5);
  173.     AddSeparator(vcc);
  174.     
  175.     attrSet = boxData.faceAttributeSet[0];
  176.     status = Q3AttributeSet_Get(attrSet, kQ3AttributeTypeDiffuseColor, &faceColor);
  177.     status = Q3AttributeSet_Get(attrSet, kQ3AttributeTypeSpecularColor, &specColor);
  178.     status = Q3AttributeSet_Get(attrSet, kQ3AttributeTypeSpecularColor, &transColor);
  179.     status = Q3AttributeSet_Get(attrSet, kQ3AttributeTypeAmbientCoefficient, &ambientCoeff);
  180.     status = Q3AttributeSet_Get(attrSet, kQ3AttributeTypeSpecularControl, &specularCntl);
  181.     
  182.     AddValueCtl(vcc, "\pfaceColor.r", faceColor.r, 0.0, 1.0, 0.1); // [16]
  183.     AddValueCtl(vcc, "\pfaceColor.g", faceColor.g, 0.0, 1.0, 0.1);
  184.     AddValueCtl(vcc, "\pfaceColor.b", faceColor.b, 0.0, 1.0, 0.1);
  185.     AddSeparator(vcc);
  186.     AddValueCtl(vcc, "\pspecColor.r", specColor.r, 0.0, 1.0, 0.1); // [20]
  187.     AddValueCtl(vcc, "\pspecColor.g", specColor.g, 0.0, 1.0, 0.1);
  188.     AddValueCtl(vcc, "\pspecColor.b", specColor.b, 0.0, 1.0, 0.1);
  189.     AddSeparator(vcc);
  190.     AddValueCtl(vcc, "\ptransColor.r", transColor.r, 0.0, 1.0, 0.1); // [24]
  191.     AddValueCtl(vcc, "\ptransColor.g", transColor.g, 0.0, 1.0, 0.1);
  192.     AddValueCtl(vcc, "\ptransColor.b", transColor.b, 0.0, 1.0, 0.1);
  193.     AddSeparator(vcc);
  194.     AddValueCtl(vcc, "\pambientCoefficient", ambientCoeff, 0.0, 1.0, 0.1); // [28]
  195.     AddValueCtl(vcc, "\pspecularControl", specularCntl, 0.0, 25.0, 2.5);
  196.  
  197. //    ErBoxData_Empty(&boxData); // releases memory allocated in Q3Box_GetData
  198. //    Q3Box_EmptyData(&boxData); // releases memory allocated in Q3Box_GetData
  199. // •• not in my shared library yet
  200.  
  201.     if (boxData.faceAttributeSet != NULL)
  202.         for (i = 0; i < 6; i++)
  203.             if (boxData.faceAttributeSet[i] != NULL)
  204.     InitBoxData(&boxData); // to bring in the original reset values (not for attributes)
  205.     SetBoxResetValues(&boxData, vcc);
  206.     
  207.     return vcc;
  208. }
  209.  
  210.  
  211. //----------------------------------------------------------------------------------
  212. void    VCCtoBoxData(VccPtr vcc, TQ3BoxData *boxData)
  213. {
  214.     TQ3Status        status;
  215.     TQ3ColorRGB        faceColor;
  216.     TQ3ColorRGB        specColor;
  217.     TQ3ColorRGB        transColor;
  218.     float            ambientCoeff;
  219.     float            specularCntl;
  220.     long            i;
  221.     
  222.     boxData->origin.x         = GetCurrentValue(vcc, 0);
  223.     boxData->origin.y         = GetCurrentValue(vcc, 1);
  224.     boxData->origin.z         = GetCurrentValue(vcc, 2);
  225.  
  226.     boxData->orientation.x     = GetCurrentValue(vcc, 4);
  227.     boxData->orientation.y     = GetCurrentValue(vcc, 5);
  228.     boxData->orientation.z     = GetCurrentValue(vcc, 6);
  229.  
  230.     boxData->majorAxis.x     = GetCurrentValue(vcc, 8);
  231.     boxData->majorAxis.y    = GetCurrentValue(vcc, 9);
  232.     boxData->majorAxis.z     = GetCurrentValue(vcc, 10);
  233.  
  234.     boxData->minorAxis.x     = GetCurrentValue(vcc, 12);
  235.     boxData->minorAxis.y     = GetCurrentValue(vcc, 13);
  236.     boxData->minorAxis.z     = GetCurrentValue(vcc, 14);
  237.     // separator
  238.     faceColor.r             =  GetCurrentValue(vcc, 16);
  239.     faceColor.g             =  GetCurrentValue(vcc, 17);
  240.     faceColor.b             =  GetCurrentValue(vcc, 18);
  241.     
  242.     specColor.r             =  GetCurrentValue(vcc, 20);
  243.     specColor.g             =  GetCurrentValue(vcc, 21);
  244.     specColor.b             =  GetCurrentValue(vcc, 22);
  245.     
  246.     transColor.r             =  GetCurrentValue(vcc, 24);
  247.     transColor.g             =  GetCurrentValue(vcc, 25);
  248.     transColor.b             =  GetCurrentValue(vcc, 26);
  249.     
  250.     ambientCoeff            =  GetCurrentValue(vcc, 28);
  251.     specularCntl             =  GetCurrentValue(vcc, 29);
  252.  
  253.     for (i = 0; i < 6; i++) {
  254.         Q3AttributeSet_Empty(boxData->faceAttributeSet[i]);
  255.          status = Q3AttributeSet_Add(boxData->faceAttributeSet[i], 
  256.                         kQ3AttributeTypeDiffuseColor, &faceColor);
  257.          status = Q3AttributeSet_Add(boxData->faceAttributeSet[i], 
  258.                         kQ3AttributeTypeSpecularColor, &specColor);
  259.          status = Q3AttributeSet_Add(boxData->faceAttributeSet[i], 
  260.                         kQ3AttributeTypeSpecularColor, &transColor);
  261.          status = Q3AttributeSet_Add(boxData->faceAttributeSet[i], 
  262.                         kQ3AttributeTypeAmbientCoefficient, &ambientCoeff);
  263.          status = Q3AttributeSet_Add(boxData->faceAttributeSet[i], 
  264.                         kQ3AttributeTypeSpecularControl, &specularCntl);
  265.     }
  266. }
  267.  
  268.  
  269. //----------------------------------------------------------------------------------
  270. void    SetBoxResetValues(TQ3BoxData *boxData, VccPtr vcc)
  271. {
  272.     SetResetValue(vcc,  0, boxData->origin.x);
  273.     SetResetValue(vcc,  1, boxData->origin.y);
  274.     SetResetValue(vcc,  2, boxData->origin.z);
  275.  
  276.     SetResetValue(vcc,  4, boxData->orientation.x);
  277.     SetResetValue(vcc,  5, boxData->orientation.y);
  278.     SetResetValue(vcc,  6, boxData->orientation.z);
  279.  
  280.     SetResetValue(vcc,  8, boxData->majorAxis.x);
  281.     SetResetValue(vcc,  9, boxData->majorAxis.y);
  282.     SetResetValue(vcc, 10, boxData->majorAxis.z);
  283.  
  284.     SetResetValue(vcc, 12, boxData->minorAxis.x);
  285.     SetResetValue(vcc, 13, boxData->minorAxis.y);
  286.     SetResetValue(vcc, 14, boxData->minorAxis.z);
  287. }
  288.  
  289.